package com.zp.qualitypractice.fragment;

import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by izp on 2017/6/25.
 */

public abstract class LazyFragment extends Fragment {
    public static final String TAG = LazyFragment.class.getSimpleName();
    private boolean mIsUserVisible;    // fragment 是否可见
    private boolean mIsFragmentViewCreated = false;  // fragment 是否创建完毕
    /**
     * 是否需要重新加载
     * 比如页面1、2、3，刚开始在 1 页面，滑动到 2 页面，
     * 此时 1 页面还在 ViewPager 的缓存中，
     * 那么当我又回到 1 页面，此时不应该重新加载
     */
    protected boolean mIsNeedReLoaded = true;

    /**
     * 在这里初始化控件
     * @param inflater
     * @param container
     * @param savedInstanceState
     * @return
     */

    protected abstract View initView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState);

    /**
     * 做数据填充和耗时操作以及处理交互
     */
    protected abstract void load();

    /**
     * @param isVisibleToUser 在生命周期中会被系统多次调用，创建是会调一次此时是不可见，在onCreateView之前
     *
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        // getUserVisibleHint() 返回该 fragment 是否可见
        if (getUserVisibleHint()) {//如果当前状态为可见
            mIsUserVisible = true;   // 那么把成员设为可见，同时回调可见时的方法
            onVisible();
        } else {
            mIsUserVisible = false;
            onInvisible();//回调不可见时的方法
        }
    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // 加载控件
        return initView(inflater, container,savedInstanceState);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mIsFragmentViewCreated = true;  // 控件已经加载好了
        lazyLoad();
    }
    /**
     * 如显示/隐藏加载框
     */
    protected void onVisible() {
        // 执行懒加载的代码
        lazyLoad();
    }

    protected void lazyLoad() {
        /**
         *  此三个条件 保证
         *  1.fragment界面已创建，fragment 执行到 onCreateView，即 控件初始化完毕
         * （由于 setUserVisibleHint 的调用时机不确定，防止控件未初始化就进行
         *                   操作，防止空指针异常）
         *  2.该 Fragment 已经可见
         *  3.是否需要加载（缓存中的页面不需要重新加载）
         */
        if (!mIsFragmentViewCreated || !mIsUserVisible || mIsNeedReLoaded) {
            return;
        }
        // 已经加载过一次，在该 fragment 未销毁的时候，不应该再次加载
        mIsNeedReLoaded = false;
        load();
    }

    /**
     * 不可见是可以调用一下界面统计等等，不过第一次创建不可见会被立即调用，然后才是可见。
     * 如显示/隐藏加载框
     */
    protected void onInvisible() {

    }
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        //
        mIsFragmentViewCreated = false;  // 控件都销毁了
        mIsNeedReLoaded = true;  // 页面都销毁了，需要重新加载
    }
}
